/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

{% set cases = [
    {
        'body': 'console.log("Hello")',
        'return_type': '',
        'description': 'The return type of an async function/method must be Promise<void> (with expresion inside function/method).'
    },
    {
        'body': 'console.log("Hello")',
        'return_type': ': Promise<void>',
        'description': 'No-argument return statement can be added implicitly as the last statement of the function
 body if there is no explicit return statement in a function/method with the return Promise<void> (with expresion inside function/method).'
    },
    {
        'body': 'return',
        'return_type': ': Promise<void>',
        'description': 'Using return statement without an expression is allowed if the return type is Promise<void>.'
    },
    {
        'body': '',
        'return_type': ': Promise<void>',
        'description': 'Using without return is allowed if the return type is Promise<void>.'
    },
    {
        'body': 'return',
        'return_type': '',
        'description': 'Using return without without explicit return type specification.'
    },
    {
        'body': '',
        'return_type': '',
        'description': 'The return type of an async function/method must be Promise<void>.'
    }
 ] %}

{% from "16.concurrency/03.asynchronous_api/async_api_helper.jinja" import generate_async, call_async %}

{%macro generate_complete_test(declaration_type='function')%}
{% for c in cases %}

 /*---
desc: {{c.description}}
---*/

{% set params = {
    'name': 'noParams',
    'body': c.body,
    'return_type': c.return_type,
    'class_name': 'AsyncMethodReturnClass'
} %}

{{ generate_async(declaration_type, params) }}

async function startTest(){
    let result = {{ call_async(declaration_type, params) }}
    arktest.assertTrue(result instanceof Promise)
    let awaited_result = await result
    arktest.assertTrue(awaited_result instanceof undefined)
}

function main(){
    waitForCompletion(startTest)
}

{% endfor %}
{% endmacro %}